Day 15 리스트(배열), 문자열
Day15 15단계 20231103
2. 조건에 맞게 수열 변환하기 2
- 내 풀이 : 비교용 배열 arr2를 만들고 난 후, arr이 연산 종료 후 두 배열을 비교해서 서로 다르면 arr2를 새 arr 복사본으로 업데이트한다. 두 배열 요소가 같으면 break
- 배열 내 모든 요소를 비교하고, 새 배열을 복사하는 구조 때문에 메모리 문제가 분명 있을 것이다.
import java.util.*;
class Solution {
public int solution(int[] arr) {
int answer = 0;
int[] arr2 = Arrays.copyOf(arr, arr.length);
start: while (true) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] >= 50 && arr[i] % 2 == 0) {
arr[i] /= 2;
} else if (arr[i] < 50 && arr[i] % 2 != 0) {
arr[i] = arr[i] * 2 + 1;
}
}
answer++;
for (int i = 0; i < arr.length; i++) {
if (arr2[i] != arr[i]) {
arr2 = Arrays.copyOf(arr, arr.length);
continue start;
} else {
if (i == arr.length - 1) {
break start;
}
}
}
}
return answer-1;
}
}
- 다른 사람 풀이 : 각 요소가 연산에 의한 변화가 있다면 boolean change를 true, 없으면 기본값 false로 설정해서 만약 change가 false인 채로 while 내 루프가 끝나면 break
3. 1로 만들기
class Solution {
public int solution(int[] num_list) {
int answer = 0;
for (int i : num_list) {
while (i != 1) {
if (i % 2 == 0) {
i /= 2;
answer++;
continue;
} else {
i = (i - 1) / 2;
answer++;
continue;
}
}
}
return answer;
}
}
- 다른 사람 풀이 1 : Stream으로 배열 요소를 Integer.toBinaryString(i).length()-1을 진행하여, 각 배열 인덱스 요소가 이진법으로 1이 될 때까지의 연산 횟수를 얻고, 연산 횟수 총 합을 계산하였다.
- 다른 사람 풀이 2 : 배열 요소가 int 이므로, 홀수의 경우 1을 빼고 2로 나눌 필요 없이 2로 나눈 몫만 반환받아 다시 루프를 돌리고, 루프 횟수를 카운트하여 총 연산 횟수를 구한다.
int answer = 0;
for (int i : num_list) {
while(i != 1) {
i /= 2;
answer++;
}
}
return answer;
5. 원하는 문자열 찾기
- 내 풀이 : pat과 myString의 대소문자를 일치시키고, 처음 myString의 길이를 저장해둔 다음, myString 내의 pat에 해당하는 부분을 replaceAll로 변환해서 바뀐 myString의 길이와 원본 myString의 길이를 비교했다.
class Solution {
public int solution(String myString, String pat) {
int origin = myString.length();
pat = pat.toLowerCase();
myString = myString.toLowerCase().replaceAll(pat, "");
return (myString.length() != origin) ? 1 : 0;
}
}
- 다른 사람 풀이 1 : 두 String의 대소문자를 일치시킨 후, pat의 myString내의 인덱스가 -1이 아니면 1을, -1이면 0(즉 없다는 것)을 반환.
- 다른 사람 풀이 2 : String 클래스의 contains() 메소드를 사용하여 pat이 myString에 있는지 확인.